package cn.itsource.object;

/**
 * Object中继承过来的方法：
 *		1. int hashCode() 返回对象的哈希码值。  
 *		2. boolean equals(Object obj) 根据实际业务，判断两个对象是不是“相等”，不是==相等
 *			比较当前调用该方法的对象和obj是不是根据业务相等。	默认不覆写是==比较
 *			要比较什么类型的对象就用重写其对应类型的equals方法			
 *
 *			例如：
 *				两个学生，我们认为姓名和电话号码相同就是同一个人，就用重写学生类的equals方法
 *				两个教师，我们认为身份证号相同就是同一个人，就用重写教师类的equals方法
 *  
 *		3. String toString() 返回对象的字符串表示形式。如果需要打印对象的制定格式，则需要重写当前对象所对应类的toString方法即可
 *			    
 *		4. Class getClass() 返回此 Object的运行时类，即当前对象所对应的字节码文件   （反射最常用）
 *			字节码文件用==比较
 */
public class StudentTest {
	public static void main(String[] args) {
		//1. int hashCode() 返回对象的哈希码值。  
		Student stu1 = new Student("波多","6969669");
		
		Student stu2 = new Student("波多","6969669");
		System.out.println("stu1.hashCode = "+ stu1.hashCode());//366712642
		System.out.println("stu1地址 = " + stu1);//cn.itsource.object.Student@15db9742	是一个stu1十六进制的hashCode
		
		System.out.println("stu2.hashCode = "+ stu2.hashCode());//1829164700
		System.out.println("stu2地址 = " + stu2);//cn.itsource.object.Student@6d06d69c	是一个stu2十六进制的hashCode
		
		//需求：我们认为对象的姓名和电话号码相同就是同一个人
		//2. boolean equals(Object obj) 根据实际业务，判断两个对象是不是“相等”，不是==相等
		boolean equals = stu1.equals(stu2);//判断stu1对象和stu2对象是不是“相等”
		System.out.println(equals);//true
		
		System.out.println("=============================");
		//3. String toString() 返回对象的字符串表示形式。如果需要打印对象的制定格式，则需要重写当前对象所对应类的toString方法即可
		//直接打印对象：是地址，不满足需求，想要打印格式，如下：[对象字段值1，对象字段值2，对象字段值3...] 如，[波多，6969669]
		System.out.println(stu1);//打印地址没有意义
		
		//4. Class getClass() 返回此 Object的运行时类，即当前对象所对应的字节码文件   （反射最常用）
		Class<? extends Student> clazz = stu1.getClass();
		System.out.println(clazz);//就是当前对象所对应的类的字节码文件（全限定路径）：class cn.itsource.object.Student
		
		Class<? extends Student> clazz2 = stu2.getClass();
		System.out.println(clazz2);//就是当前对象所对应的类的字节码文件（全限定路径）：class cn.itsource.object.Student
		System.out.println(clazz == clazz2);//true,字节码文件用==比较
		
	}
}
